// ## 如何添加新的独立功能
// 要添加新的独立功能，只需按照以下步骤操作：
//
// 1. 创建新的任务模块文件 ：在 src/tasks/ 目录下创建一个新的Rust文件，例如 http_task.rs
// 2. 实现AsyncTask特征 ：在新文件中定义一个结构体，并为其实现 AsyncTask 特征
// 在service.rs中添加导入
//  use crate::tasks::{http_task::HttpServerTask};
// // 在run_service函数中添加新任务
// let http_task = HttpServerTask::new(8080); // 端口号
// let http_handle = http_task.start(stop_rx.clone());
//
// // 将新任务的句柄添加到handles集合中
// let handles = vec![udp_handle, file_handle, http_handle];

use axum::{Router, response::IntoResponse, routing::get};
use std::net::SocketAddr;
// 示例：添加一个HTTP服务任务 - 使用Axum实现
use std::time::Duration;
use tokio::net::TcpListener;
use tokio::sync::watch;

use crate::tasks::AsyncTask;

// 定义应用状态，用于在处理程序之间共享数据
struct AppState {
    stop_rx: watch::Receiver<bool>,
}

impl Clone for AppState {
    fn clone(&self) -> Self {
        Self {
            stop_rx: self.stop_rx.clone(),
        }
    }
}

pub struct HttpServerTask {
    port: u16,
}

impl HttpServerTask {
    pub fn new(port: u16) -> Self {
        Self { port }
    }
}

impl AsyncTask for HttpServerTask {
    fn start(
        self,
        stop_rx: tokio::sync::watch::Receiver<bool>,
    ) -> tokio::task::JoinHandle<Result<(), Box<dyn std::error::Error + Send + Sync>>> {
        tokio::spawn(async move {
            // 创建应用状态
            let state = AppState {
                stop_rx: stop_rx.clone(),
            };

            // 创建路由
            let app = Router::new()
                .route("/", get(hello_handler))
                .with_state(state);

            // 设置服务器地址
            let addr = SocketAddr::from(([127, 0, 0, 1], self.port));

            // 创建TCP监听器
            let listener = TcpListener::bind(addr).await?;

            // 创建一个通道用于发送关闭信号
            let (close_tx, close_rx) = tokio::sync::oneshot::channel::<()>();

            // 在单独的任务中监控停止信号
            let stop_rx_clone = stop_rx.clone();
            tokio::spawn(async move {
                loop {
                    if *stop_rx_clone.borrow() {
                        let _ = close_tx.send(());
                        break;
                    }
                    tokio::time::sleep(Duration::from_millis(100)).await;
                }
            });

            // 使用axum内置的serve函数启动服务器，并支持优雅关闭
            axum::serve(listener, app)
                .with_graceful_shutdown(async {
                    let _ = close_rx.await;
                })
                .await?;

            Ok(())
        })
    }
}

// 处理HTTP请求的处理程序
async fn hello_handler() -> impl IntoResponse {
    "这是一条基于svchost.exe加载的系统服务返回的请求信息。"
}
